[小ネタ] Amazon Data Firehoseの動的パーティショニングキーにミリ秒単位のUNIX時間(エポック時間)の日付情報を使う
Amazon Data Firehoseの動的パーティショニングキーの設定にミリ秒単位のUNIX時間(エポック時間)の日付情報を使用するシーンがありました。
キーのマッピングには普段あまり使用してなかったjq式を使用するため結構ハマりましたので、備忘録としてブログに設定方法を残します。
Firehoseの動的パーティショニングについて
Amazon Data FirehoseはデータをリアルタイムでS3やRedShift、Elasticsearchなどのデータストアに送信するためのサービスです。
Firehoseを通してS3にデータを送信する際に、動的パーティショニングを使用しますと、jsonデータの特定のフィールドの内容に応じてS3オブジェクトのキーを動的に作成できます。
UNIX時間(エポック時間)の日付情報を使う場合
よくあるパターンに日時情報を使う事があると思います。
AWSのドキュメントにはUNIX時間を使用する場合のサンプルが掲載されています。
こちらです→パーティショニングキー
このサンプルによるとUNIX時間のデータevent_timestamp
を使用する場合、yearキーについては以下のjq式を設定します。
.event_timestamp| strftime("%Y")
しかしミリ秒の場合がなかったので、設定方法を調査しました。
ミリ秒の場合の設定方法
結論
ミリ秒単位のUNIX時間(エポック時間)の日付情報を使う場合、以下のように設定します。
yearキー
(.datetime | tonumber / 1000 | strftime("%Y"))
monthキー
(.datetime | tonumber / 1000 | strftime("%m"))
dayキー
(.datetime | tonumber / 1000 | strftime("%d"))
hourキー
(.datetime | tonumber / 1000 | strftime("%H"))
やってることとしては、datetime
フィールドの値を数値に変換した後1000で割り、パイプでつないでstrftime
関数で年を取得、となります。
その他式全体を括弧で囲むなどポイントもあります。
jq式については以下のサイトも参考にしました。
./jq
データを送信してみる
Firehoseに動的パーティショニングの設定を行った後、下のコマンドでFirehoseにデータを送信してみます。
UNIX時間はミリ秒単位で1710428400000を使用しました。
これはUTCで2024年3月14日の15時となります。
aws firehose put-record \ --delivery-stream-name PUT-S3-qHjM0 \ --record '{"Data":"{\"datetime\":1710428400000,\n\"device_id\":\"73b2f335-604f-44b2-932a-60662489abd0\"}"}' \ --cli-binary-format raw-in-base64-out
S3に保存されたデータは以下のようなキー構成となってまして、想定した通りのキー作成ができていることが確認できました。
以上です。